#ifndef	_J_DRETVE_H_
#define	_J_DRETVE_H_

//javno  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

#include <dretve.h>

#include "tipovi.h"
#include "prioriteti.h"

void j_visedretvenost_inicijaliziraj ();

//osnovno s dretvama
int j_stvori_dretvu (void *param);
int j_dretva_odstupi(void *param);
int j_dretva_zavrsetak (void *param);
int j_id_dretve (void *param);
int j_dohvati_prioritet (void *param);
int j_dohvati_nacin_rasporedjivanja (void *param);
int j_postavi_prioritet (void *param);
int j_cekaj_kraj_dretve (void *param);
int j_zaustavi_latentnu_dretvu (void *param);

//javno  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

#if defined(_J_DRETVE_C_) || defined(_J_RED_C_) ||			\
	defined(_J_SINKRONIZACIJA_C_) || defined(_J_DOGADJAJI_C_)

//samo za dretve.c i "prijatelje"  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

#include "dogadjaji.h"

#include <arh/kontekst.h>

typedef struct _j_opisnikdretve_t_ {
	void *stog;		//"kontekst" je na stogu, trebam pokazivac stoga

	int id;			//id dretve

	int prio;		//prioritet
	int rasp;		//nacin rasporedjivanja

	struct _j_opisnikdretve_t_ *iduci; //pokazivac na iduci opisnik dretve u
				//redu u kom se i ova nalazi, NULL ako je zadnja

	int red;		//u kojem je stanju/redu, 0-Akt, 1-pripr

	int alarm;		//id alarma koji ce prekinut cekanje ove dretve
				//u nekom redu (ako je != -1)
	
	int kraj;		//id reda dretvi koje cekaju kraj ove dretve
	
	din_prio_t dp;		//struktura za cuvanje dinamicki povecanih
				//prioriteta (i njihovo vracanje)

	j_red_dog_dretve_t red_dog; //red dogadjaja poslanih dretvi

	int *povvr;		//adresa za povratnu vrijednost (za naknadno
				//mijenjanje)


	//mjesto za kontekst - "stog" za ring 0, kad se dogodi prekid
	kontekst_dretve_t kontekst;

} j_opisnikdretve_t;

typedef struct _j_lista_dretvi_t_ {
	j_opisnikdretve_t *prvi;
	j_opisnikdretve_t *zadnji;
} j_lista_dretvi_t;

//"interne" funkcije
void j_samo_stavi_u_pripravne (j_opisnikdretve_t *opd);
void j_aktiviraj_prvu_pripravnu();
inline j_opisnikdretve_t *j_aktivna_dretva();
inline j_opisnikdretve_t *j_dohvati_opisnik(int id);
void j_azuriraj_stog ();

int j_povecaj_prioritet (int id_dretve, int nprio, void *razlog);
int j_vrati_prioritet (int id_dretve, void *razlog);
int j_promijeni_prioritet (int id, int nprio);

//sucelje za red.c
void j_postavi_dretvin_alarm(j_opisnikdretve_t *_opd, void *koliko);
void j_obrisi_dretvin_alarm(j_opisnikdretve_t *_opd);

void j_odblokiraj_dretvu (j_opisnikdretve_t *opd);

#elif defined(_J_VRIJEME_C_)

typedef void j_opisnikdretve_t;

void j_odblokiraj_dretvu (j_opisnikdretve_t *opd);

#endif	/* _J_DRETVE_C_ i ostale */

void j_zapisi_adresu_povratne_vrijednosti(int *ppovvr);

#endif	/* _J_DRETVE_H_ */